package cuiyt.juc.demo01;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author cyt
 * @create 2020-04-29 18:23
 */
public class Lockdemo01 {

    // 定义资源类， 把资源类丢入线程中去
    public static void main(String[] args) {
        tick2 tick = new tick2();

        // 使用 lambda 表达式来开启多线程
        new Thread(() -> { for (int i = 0; i < 5; i++) tick.sale();  }, "A").start();

        new Thread(() -> { for (int i = 0; i < 5; i++) tick.sale();  }, "B").start();

        new Thread(() -> { for (int i = 0; i < 5; i++) tick.sale();  }, "C").start();
    }
}

/**
 * 使用lock
 * 1、创建它的实现类
 * 2、显示的加锁
 * 3、显示的解锁
 */
class tick2 {
    private Integer number = 20;
    // 创建锁
    Lock lock = new ReentrantLock();
    public void sale() {
        // 显示的上锁
        lock.lock();
        try {
            // 业务的代码
            if (number > 0) {
                System.out.println(Thread.currentThread().getName() + "卖出了" + (number--) + "票， 剩余： " + number);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 解锁
            lock.unlock();
        }
    }
}
